package com.woniuxy.config;

import com.woniuxy.core.service.ShopOrderService;
import com.woniuxy.entity.ShopOrder;
import com.woniuxy.enums.order.ShopOrderStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 处理支付成功的订单消息
 */
@Slf4j
@Component
public class OrderPaymentSuccessConsumer {

    @Autowired
    private ShopOrderService shopOrderService;

    /**
     * 监听支付成功消息队列
     * 消息体建议包含：订单编号、支付时间、支付金额、支付方式等
     */
    @RabbitListener(queues = RabbitMQConfig.ORDER_PAY_SUCCESS_QUEUE)
    public void handlePaymentSuccess(Map<String, Object> paymentInfo) {
        try {
            String orderNumber = (String) paymentInfo.get("orderNumber");
            log.info("收到支付成功消息，开始处理订单：{}", orderNumber);

            // 1. 校验订单存在性
            ShopOrder order = shopOrderService.getByOrderByNumber(orderNumber);
            if (order == null) {
                log.warn("支付成功但订单不存在：{}", orderNumber);
                return;
            }

            // 2. 校验订单状态（防止重复处理）
            if (order.getStatus() == ShopOrderStatus.PAID.getCode()) {
                log.info("订单{}已处理过支付成功，无需重复处理", orderNumber);
                return;
            }

            // 3. 校验订单是否处于待支付状态
            if (order.getStatus() != ShopOrderStatus.PENDING.getCode()) {
                log.warn("订单{}状态异常（当前状态：{}），无法处理支付成功",
                        orderNumber, order.getStatus());
                return;
            }

            // 4. 处理支付成功逻辑
            // 4.1 更新订单状态为"已支付"
            shopOrderService.updateOrderStatus(
                    order.getId(),
                    ShopOrderStatus.PAID.getCode()
            );

            // 4.3 其他业务逻辑：
            // - 通知卖家订单已支付
            // - 扣减库存（如果需要）
            // - 增加用户积分
            // - 标记优惠券为已使用

            log.info("订单{}支付成功处理完成", orderNumber);

        } catch (Exception e) {
            log.error("处理支付成功消息异常", e);
            // 可根据需要发送到死信队列，进行人工干预
            throw new RuntimeException("处理支付成功消息失败", e);
        }
    }
}